/*
call,apply对不同参数进行处理
1、不传参，或者传入null和undefined，this指向window;        
2、传入基本数据类型(null和undefined除外)，this指向他们的包装对象;        
3、传入的是对象，this就指向这个对象;
*/
/*
 es5在Function.prototype上新增了一个bind方法，
* 该方法返回一个函数，这个函数可以认为是绑定了this的clone版本。
* 语法：新函数 = 函数.bind(this)
*
* bind和call、apply的异同：
* 1、相同之处是都可以改变函数运行时内部的this
* 2、不同之处是call和apply是一次性改变this，bind是永久性改变this
*
* 可以认为bind的灵活性更高，你可以先把this绑定好，
* 然后什么时候想执行就什么时候执行。
*/
function add(a, b) {
    console.log(this.length + a + b);
}
add.call([1, 2, 3], 10, 50);
add.bind([1,2,3], 10, 50)();
// call返回为立即执行，bind返回为一个函数并不会立即执行


// 封装函数 f，使 f 的 this 指向指定的对象
function bindThis(f, oTarget) {
    if(f.bind) {
        return f.bind(oTarget);
    } else {
        return function() {
            return f.apply(oTarget, arguments);
        }
    }
    
}